iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
1
Mobile Development

Android 開發經驗三十天系列 第 11

[Android 開發經驗三十天+Spring Boot]#D11-DI (Dagger in Android / IOC in Spring Boot)前言

  • 分享至 

  • xImage
  •  

大家安安,今天過得好嗎?
寫這篇主要是想複習自己的DI觀念
之後也會介紹 Dagger in Android 跟 Spring Boot銜接

那就 開始吧?

#1.甚麼是DI?

DI的英文是Dependency Injection,中文叫依賴注入

1.1 為甚麼要使用DI?

A:主要是要處理 耦合性過高 的問題,才方便修改和做單元測試
好處
1.低耦合
2.更清晰的意圖
3.可維護性提高
4.可測試性

舉個耦合性過高的例子

class A(){
  //...
  private Sring hello="";
  String hello(String hello){
    this.hello=hello;
    return "aacutty"+hello;
  }
} 

class B(){
  A aa=new A();
  aa.hello("wow");
}

因為是用new Class的方式,所以一旦A生產的方式有改變 && 需要替代掉A (不想用A)之類的,這樣B class內的方法也需要修改。
若是做單元測試,以Spring Boot為例,你若想測試單一Class卻不想測試到資料庫,但是Class 與資料庫緊緊耦合在一起(ex new)那就不能拆開來測試了

若做DI,則能輕鬆將原本依賴的真實物件替換為mock物件

2.用DI的幾種方式 ?

#1.interface ( Setter injection)

如果要把A class 改成 C class,我們可以用interface的方式實現,
這樣就不會因為要修改所以改動大一堆邏輯
當要決定與誰耦合只需要改動setICU(new A())裡面的參數
如果要同時改動hello方法的參數,也可以直接改動interface ICA內傳入為甚麼

public interface ICA {
    public hello(String hello);
}
class A() implements ICA{
  //...
  private Sring hello="";
  @Override
  String hello(String hello){
    return "aacutty"+hello;
  }
} 
class C() implements ICA{
  //...
  private Sring hello="";
  @Override
  String hello(String hello){
    this.hello=hello;
    return "ccutty"+hello;
  }
} 
class B(){
 /*   A aa=new A();
  aa.hello("wow"); */
  private ICA ica;
   public void setICU(ICA ica) {
        this.ica = ica;
    }
    
    //決定跟誰耦合
  //  setICU(new A()) 
   // setICU(new C())
  
  ica.hello();
}

#2.constructor (Constructor injection)

constructer 的方式就是在construter將所有需要依賴注入的東西傳進去
好處就是一次傳完,相較於set
不過如果是要傳很多東西還是用set比較好,因為又比較分離一點修改比較方便

public interface ICA {
    public hello(String hello);
}
class A() implements ICA{
  //...
  private Sring hello="";
  @Override
  String hello(String hello){
    return "aacutty"+hello;
  }
} 
class C() implements ICA{
  //...
  private Sring hello="";
  @Override
  String hello(String hello){
    this.hello=hello;
    return "ccutty"+hello;
  }
} 
class B(){
 private ICA ica;
    class B(ICA ica){
        this.ica=ica;
    }
}

然後Spring Boot 底層就是IOC容器,等於只要加一些他要求的就可以直接注入了!!
相較於Spring要在config (xml) 中修改更方便許多

Android 的話 , Dagger可以幫你不用每次都new一個東西,如果想要在不同Class中拿到同一個object ,除了用傳遞的方式也可以用Dagger,只要綁同一個Scope,Component拿到的就是同一個 (因為不用重new),也可以節省重new很多重複東西的功夫

這兩者一樣有DI的方便性,若是熟悉就會易修改易處理,Dagger也是用@annotation的方式,如果有錯誤在編譯時期就會報錯

大概是這樣,如果有說錯可以跟我說~
之後會分別介紹 Dagger && Spring Boot


上一篇
[Android 開發經驗三十天+Spring Boot]D10一Spring Boot Day1 +介紹實作目標
下一篇
[Android 開發經驗三十天]D12一Dagger(上)
系列文
Android 開發經驗三十天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言